using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; // .xlsx
using NPOI.HSSF.UserModel; // .xls

public class ExcelBatchInserter
{
    public void InsertDiscontinuousRows(
        string filePath,
        string sheetName,
        Dictionary<int, int> insertPositions // Key: 插入行号（从0开始）, Value: 插入行数
    )
    {
        using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
        {
            // 1. 加载工作簿
            IWorkbook workbook = Path.GetExtension(filePath).ToLower() switch
            {
                ".xls" => new HSSFWorkbook(fs),
                ".xlsx" => new XSSFWorkbook(fs),
                _ => throw new NotSupportedException("不支持的文件格式")
            };

            ISheet sheet = workbook.GetSheet(sheetName) ?? 
                throw new ArgumentException($"工作表 '{sheetName}' 不存在");

            // 2. 按行号倒序处理
            var sortedPositions = insertPositions
                .OrderByDescending(kv => kv.Key)
                .ToList();

            foreach (var pos in sortedPositions)
            {
                int targetRow = pos.Key;
                int insertCount = pos.Value;

                // 3. 移动现有行（从目标行下方开始）
                if (sheet.LastRowNum >= targetRow + 1)
                {
                    sheet.ShiftRows(
                        startRow: targetRow + 1,
                        endRow: sheet.LastRowNum,
                        n: insertCount,
                        isCopyRowHeight: true,
                        resetOriginalRowHeight: true
                    );
                }

                // 4. 插入多行
                for (int i = 0; i < insertCount; i++)
                {
                    int newRowIndex = targetRow + 1 + i;
                    IRow newRow = sheet.CreateRow(newRowIndex);
                    InitializeRowStyle(sheet, newRow, targetRow);
                }
            }

            // 5. 保存文件
            using (var newFs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(newFs);
            }
        }
    }

    /// <summary>
    /// 初始化新行样式（复制参考行样式）
    /// </summary>
    private void InitializeRowStyle(ISheet sheet, IRow newRow, int referenceRowIndex)
    {
        IRow refRow = sheet.GetRow(referenceRowIndex) ?? sheet.GetRow(referenceRowIndex - 1);
        if (refRow == null) return;

        // 复制行高
        newRow.Height = refRow.Height;

        // 复制单元格样式
        for (int col = 0; col < refRow.LastCellNum; col++)
        {
            ICell srcCell = refRow.GetCell(col);
            if (srcCell == null) continue;

            ICell newCell = newRow.CreateCell(col);
            ICellStyle newStyle = sheet.Workbook.CreateCellStyle();
            newStyle.CloneStyleFrom(srcCell.CellStyle);
            newCell.CellStyle = newStyle;
        }
    }
}

// 使用示例
var inserter = new ExcelBatchInserter();
var insertMap = new Dictionary<int, int>
{
    {4, 2},  // 在第5行后插入2行
    {9, 1},  // 在第10行后插入1行
    {14, 3}  // 在第15行后插入3行
};
inserter.InsertDiscontinuousRows("data.xlsx", "Sheet1", insertMap);

// 动态数据插入
// 在插入循环中添加数据
// 
for (int i = 0; i < insertCount; i++)
{
    int newRowIndex = targetRow + 1 + i;
    IRow newRow = sheet.CreateRow(newRowIndex);
    
    // 示例：填充数据
    newRow.CreateCell(0).SetCellValue("New Data");
    newRow.CreateCell(1).SetCellValue(DateTime.Now.ToString());
    
    // 设置公式（自动调整行号）
    newRow.CreateCell(2).SetCellFormula($"A{newRowIndex + 1}*B{newRowIndex + 1}");
}


// 公式自动调整
// 通过 SetCellFormula 时动态计算行号：
// 假设原始公式在第5行是 "A5+B5"
// 插入新行后，公式会自动调整为 "A6+B6"

// 异常处理
try
{
    inserter.InsertDiscontinuousRows(...);
}
catch (IOException ex)
{
    Console.WriteLine($"文件被占用: {ex.Message}");
}
catch (ArgumentException ex)
{
    Console.WriteLine($"参数错误: {ex.Message}");
}

// 样式深度复制
// 完整复制字体、边框等样式
newStyle.CloneStyleFrom(srcCell.CellStyle)
